import 'reflect-metadata'

interface ModuleMetadata {
  controllers?: Function[]
  providers?: any[]
  imports?: any[] // 可以导入模块 把导入的模块中的 exports 中的提供者或模块导入的模块给自己使用
  exports?: any[] // 模块的导出 可以导出 imports 中的模块 也可以导出自己的提供者
}

/**
 * 工厂 返回一个类装饰器\
 * 用于标识一个类是模块
 */
export function Module (metadata: ModuleMetadata) {
  /**
   * 给模块类添加元数据\
   * 类装饰器 target 是类本身 
   */
  return (target: Function) => {
    // 给模块类添加一个 controllers 元数据 值是 metadata.controllers 控制器类组成的数组
    Reflect.defineMetadata('controllers', metadata.controllers, target)
    // 给模块类添加一个 providers 元数据 值是 metadata.providers 提供者组成的数组
    Reflect.defineMetadata('providers', metadata.providers, target)
    // 给模块类添加一个 imports 元数据 值是 metadata.imports 导入的模块组成的数组
    Reflect.defineMetadata('imports', metadata.imports, target)
    // 给模块类添加一个 exports 元数据 值是 metadata.exports 导出的模块或提供者组成的数组
    Reflect.defineMetadata('exports', metadata.exports, target)
  }
}
